package br.unirio.leilao.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.unirio.leilao.entity.ComentarioAlbum;
import br.unirio.leilao.entity.ComentarioUsuario;
import br.unirio.leilao.entity.Usuario;

public class UsuarioDAO {

	private Connection connection;
	private static UsuarioDAO instance;
	
	/**
	 * abre conexao com o banco
	 */
	public UsuarioDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	/**
	 * Retorna a instancia unica da classe
	 * @return
	 */
	public static UsuarioDAO getInstance()
	{
		if (instance == null)
			instance = new UsuarioDAO();
		
		return instance;
	}

	/**
	 * adiciona um usuario no banco.
	 * @param usuario
	 */
	public void adiciona(Usuario usuario) {
		
		String sql = "insert into usuario (Nome, SobreNome, Login, Senha) values (?,?,?,?)";
		
		try {
			// prepared statement para insercao
			PreparedStatement stmt = connection.prepareStatement(sql);
			// seta os valores
			stmt.setString(1, usuario.getNome());
			stmt.setString(2, usuario.getSobrenome());
			stmt.setString(3, usuario.getLogin());
			stmt.setString(4, usuario.getSenha());
			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * edita um usuario no banco.
	 * @param usuario
	 */
	public void edita(Usuario usuario) {
		System.out.println("Passei em UsuarioDAO.edita");
		String sql = "update usuario set Nome=?, SobreNome=?, Login=?, Senha=? where ID=?";
		
		try {
			// prepared statement para insercao
			PreparedStatement stmt = connection.prepareStatement(sql);
			// seta os valores
			stmt.setString(1, usuario.getNome());
			stmt.setString(2, usuario.getSobrenome());
			stmt.setString(3, usuario.getLogin());
			stmt.setString(4, usuario.getSenha());
			stmt.setInt(5, usuario.getId());
			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * edita um usuario no banco.
	 * @param usuario
	 */
	public void trocarSenha(String loginUsu, String senhaUsu) {
		System.out.println("Passei em UsuarioDAO.trocarSenha");
		String sql = "update usuario set Senha=? where Login=?";
		
		try {
			// prepared statement edicao
			PreparedStatement stmt = connection.prepareStatement(sql);
			// seta os valores
			stmt.setString(1, senhaUsu);
			stmt.setString(2, loginUsu);
			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * Busca um usuario pelo ID
	 * @return Usuario
	 */
	public Usuario getUsuarioById(int id) {
		
		Usuario usu = new Usuario();
		
		try {
			String sql = "select * from usuario where id=?";
			PreparedStatement stmt = connection.prepareStatement(sql);
			//seta o valor 
			stmt.setInt(1,id);
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				
				usu.setId(rs.getInt("ID"));
				usu.setNome(rs.getString("Nome"));
				usu.setSobrenome(rs.getString("Sobrenome"));
				usu.setLogin(rs.getString("Login"));
				usu.setSenha(rs.getString("Senha"));	
			}
			rs.close();
			stmt.close();
			return usu;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * Busca um usuario pelo Login
	 * @return Usuario
	 */
	public Usuario getUsuarioByLogin(String login) {
		System.out.println("passei em usuDao getusubyLOGIN");
		Usuario usu = new Usuario();
		
		try {
			String sql = "select * from usuario where login=?";
			PreparedStatement stmt = connection.prepareStatement(sql);
			//seta o valor 
			stmt.setString(1,login);
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				System.out.println(rs.getInt("ID"));
				usu.setId(rs.getInt("ID"));
				usu.setNome(rs.getString("Nome"));
				usu.setSobrenome(rs.getString("Sobrenome"));
				usu.setLogin(rs.getString("Login"));
				usu.setSenha(rs.getString("Senha"));	
			}
			rs.close();
			stmt.close();
			return usu;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * retorna a lista de todos os usuarios cadastrados.
	 * @return List<Usuario>
	 */
	public List<Usuario> getLista() {
		
		try {
			List<Usuario> usuarios = new ArrayList<Usuario>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from usuario");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				Usuario usuario = new Usuario();
				usuario.setId(rs.getInt("ID"));
				usuario.setNome(rs.getString("Nome"));
				usuario.setSobrenome(rs.getString("Sobrenome"));
				usuario.setLogin(rs.getString("Login"));
				usuario.setSenha(rs.getString("Senha"));

				usuarios.add(usuario);
			}
			rs.close();
			stmt.close();
			return usuarios;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * retorna a lista de todos os usuarios cadastrados.
	 * @return List<Usuario>
	 */
	public List<ComentarioUsuario> getComentarios(int id) {
		
		try {
			List<ComentarioUsuario> comentarios = new ArrayList<ComentarioUsuario>();
			PreparedStatement stmt = this.connection.prepareStatement("select distinct * from comentariousuario where IDRemetente=? or IDDestinatario=?");
			//seta o valor 
			stmt.setInt(1,id);
			stmt.setInt(2,id);
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				ComentarioUsuario comentarioUsuario = new ComentarioUsuario();
				comentarioUsuario.setId(rs.getInt("ID"));
				comentarioUsuario.setRemetente(UsuarioDAO.getInstance().getUsuarioById(rs.getInt("IDRemetente")));
				comentarioUsuario.setDestinatario(UsuarioDAO.getInstance().getUsuarioById(rs.getInt("IDDestinatario")));
				comentarioUsuario.setComentario(rs.getString("Comentario"));
				comentarioUsuario.setData(rs.getDate("Data"));

				comentarios.add(comentarioUsuario);
			}
			rs.close();
			stmt.close();
			return comentarios;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * adiciona um comentarios sobre o usuario no banco.
	 * @param usuario
	 */
	public void adicionaComentarioUsuario(ComentarioUsuario comentario) {
		
		String sql = "INSERT INTO `comentariousuario`(`IDRemetente`,`IDDestinatario`,`Comentario`, `Data`) VALUES (?,?,?,?);";
		
		try {
			// prepared statement para insercao
			PreparedStatement stmt = connection.prepareStatement(sql);
			// seta os valores
			stmt.setInt(1, comentario.getRemetente().getId());
			stmt.setInt(2, comentario.getDestinatario().getId());
			stmt.setString(3, comentario.getComentario());
			Calendar stCal = Calendar.getInstance();
			java.util.Date utlDate = stCal.getTime();
			java.sql.Date sqlDate = new java.sql.Date(utlDate.getTime());;
			stmt.setDate(4, sqlDate);
			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}
